﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using System.Configuration;
using Iudicium.Configuracion.CRN;

namespace Iudicium.Configuracion
{

    /// <summary>
    /// Descripción breve de ConfiguracionIudicium
    /// </summary>
    public class ConfiguracionIudicium
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");

        public ConfiguracionIudicium()
        {
            
        }

        public static string GetApplicationName()
        {
            string applicatinName = "Iudicium";
            try
            {
                applicatinName = ConfigurationManager.AppSettings["ApplicationName"];
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el nombre de la Aplicacion", ex);
            }
            return applicatinName;
        }

        public static int GetGridPageSize()
        {
            int gridPageSize = 30;
            try
            {
                gridPageSize = Convert.ToInt32(ConfigurationManager.AppSettings["GridPageSize"]);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el valor del tamanho de la pagina de un grid view", ex);
            }
            return gridPageSize;
        }

        public static void VerficicarVersion()
        {
            int appVersionMayor = 0;
            int appVersionMenor = 0;
            int appRelease = 0;

            try
            {
                appVersionMayor = Convert.ToInt32(ConfigurationManager.AppSettings["VersionMayor"]);
                appVersionMenor = Convert.ToInt32(ConfigurationManager.AppSettings["VersionMenor"]);
                appRelease = Convert.ToInt32(ConfigurationManager.AppSettings["Release"]);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener los datos de la version de la Aplicacion", ex);
                HttpContext.Current.Session["ERROR_MESSAGE"] = "No se pudo obtener los datos de la version de la Aplicacion. Por favor contacte con el Administrador.";
                HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            int dbVersionMayor = 0;
            int dbVersionMenor = 0;
            int dbRelease = 0;

            try
            {
                Version objVersion = VersionCRN.GetVersion();
                dbVersionMayor = objVersion.VersionMayor;
                dbVersionMenor = objVersion.VersionMenor;
                dbRelease = objVersion.Release;
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener los datos de la version de la Base de datos", ex);
                HttpContext.Current.Session["ERROR_MESSAGE"] = "No se pudo obtener los datos de la version de la Base de datos. Por favor contacte con el Administrador.";
                HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            bool appVersionNotZero = appVersionMayor + appVersionMenor + appRelease > 0;
            bool dbVersionNotZero = dbVersionMayor + dbVersionMenor + dbRelease > 0;
            bool isValid = appVersionNotZero && dbVersionNotZero && appVersionMayor == dbVersionMayor && appVersionMenor == dbVersionMenor;
            if (!isValid)
            {
                log.Error("La version de la Aplicacion no coincide con la version de la base de Datos");
                HttpContext.Current.Session["ERROR_MESSAGE"] = "La version de la Aplicacion no coincide con la version de la base de Datos. Por favor contacte con el Administrador.";
                HttpContext.Current.Response.Redirect("~/FatalError.aspx", true);
            }
            log.Debug("Version OK...");
        }

        public static void ConfigurarUsuarios()
        {
            bool exist = false;
            string adminUserName = null;
            string adminPassword = null;
            try
            {
                adminUserName = ConfigurationManager.AppSettings["AdminUser"];
                adminPassword = ConfigurationManager.AppSettings["AdminDefaultPassword"];
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener los datos iniciales del usuario por defecto del sistema", ex);
                //HttpContext.Current.Session["ERROR_MESSAGE"] = "No se pudo obtener los datos iniciales del usuario por defecto del sistema";
                //HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            Iudicium.Seguridad.Usuario user = null;
            try
            {
                user =
                    Iudicium.Seguridad.CRN.UsuarioCRN.GetUsuarioByUserNameAndPassword(adminUserName, adminPassword);

                exist = user != null;
            }
            catch (Exception ex)
            {
                log.Error("No se pudo crear verificar la existencia del Usuario por defecto", ex);
                //HttpContext.Current.Session["ERROR_MESSAGE"] = "No se pudo verificar la existencia del usuario por defecto del sistema";
                //HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            if (exist)
                return;


            string adminFullName = "";
            string adminRole = "";
            try
            {
                adminFullName = ConfigurationManager.AppSettings["AdminFullName"];
                adminRole = ConfigurationManager.AppSettings["AdminRole"];
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el Rol y nombre del usuario por defecto", ex);
                //HttpContext.Current.Session["ERROR_MESSAGE"] = "No se pudo obtener el Rol y nombre del usuario por defecto.";
                //HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            if (string.IsNullOrEmpty(adminFullName) || string.IsNullOrEmpty(adminRole))
            {
                log.Error("El Rol y nombre del usuario por defecto estan vacios o nulos.");
                //HttpContext.Current.Session["ERROR_MESSAGE"] = "Los valores para el Nombre del Usuario y el Nombre del Rol por defecto no son correctos.";
                //HttpContext.Current.Response.Redirect("~/FatalError.aspx");
            }

            try
            {
                Persona.PersonaNatural objPersona = new Iudicium.Persona.PersonaNatural(0, adminFullName, "0", "SCZ", "M");

                int id = Iudicium.Persona.CRN.PersonaNaturalCRN.InsertPersonaNatural(objPersona);

                Iudicium.Seguridad.Rol rol = Iudicium.Seguridad.CRN.RolCRN.GetRolByNombre(adminRole);

                if(rol == null)
                {
                    rol = new Iudicium.Seguridad.Rol(0, adminRole, Iudicium.Seguridad.Rol.EstadoRol.Activo);
                    Iudicium.Seguridad.CRN.RolCRN.InsertRol(rol);
                }

                Iudicium.Seguridad.Usuario newUser = 
                    new Iudicium.Seguridad.Usuario(id, adminUserName, Utilitarios.Utilitarios.Encriptar(adminPassword), rol.RolId, Iudicium.Seguridad.Usuario.EstadoUsuario.Activo);

                Iudicium.Seguridad.CRN.UsuarioCRN.InsertUsuario(newUser);
            }
            catch (Exception ex)
            {
                log.Error("No se crear el usuario por defecto del sistema.", ex);
            }
        }
    }
}